package main

import "go-leetcode/leetcode/utils"

// 19. 删除链表的倒数第 N 个结点
func main() {
	listNode := utils.GetListNodeByArray([]int{1, 2, 3, 4})
	k := 2
	newHead := removeNthFromEnd(listNode, k)

	for newHead != nil {
		print(newHead.Val, "->")
		newHead = newHead.Next
	}

}

func removeNthFromEnd(head *utils.ListNode, n int) *utils.ListNode {
	dummy := &utils.ListNode{
		Next: head,
	}
	slow, fast := dummy, dummy
	for i := 0; i < n; i++ {
		if fast == nil {
			return nil
		}
		fast = fast.Next
	}
	for fast != nil && fast.Next != nil {
		slow = slow.Next
		fast = fast.Next
	}
	if slow != nil && slow.Next != nil {
		slow.Next = slow.Next.Next
	}

	return dummy.Next
}

// 给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。
//
//示例 1：
//
//输入：head = [1,2,3,4,5], n = 2
//输出：[1,2,3,5]
//示例 2：
//
//输入：head = [1], n = 1
//输出：[]
//示例 3：
//
//输入：head = [1,2], n = 1
//输出：[1]
//
//提示：
//
//链表中结点的数目为 sz
//1 <= sz <= 30
//0 <= Node.val <= 100
//1 <= n <= sz
//
//进阶：你能尝试使用一趟扫描实现吗？
